Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Hanko passkeys support #14741

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
Open

feat: Hanko passkeys support #14741

wants to merge 13 commits into from

Conversation

merlindru
Copy link

Note: This previously was #13127 but has since been reworked and simplified

What does this PR do?

Fixes #13342
Fixes CAL-2984

This PR adds passkey support for logging in through Hanko Passkeys.

Type of change

  • New feature (non-breaking change which adds functionality)
  • This change requires a documentation update (probably)

How should this be tested?

  • Go to cloud.hanko.io and create a "Passkey API" project
    • Then create a new API key
      set it to HANKO_PASSKEYS_API_KEY="<api key>"
      (quotes important)
    • Copy the tenant ID to NEXT_PUBLIC_HANKO_PASSKEYS_TENANT_ID=<tenant id>
  • Log in as normal (with password/google/...)
  • Go to settings > passkeys > create a new passkey
  • Log out
  • Go to login > sign in with a passkey

Mandatory Tasks

  • Make sure you have self-reviewed the code. A decent size PR without self-review might be rejected.

next-auth-options.ts

This file now includes a PasskeyProvider.

For its authorize function, I've collected all of the important checks I could find in the email+password provider (a.k.a. CredentialsProvider), such as rate-limiting, user.locked, belongsToActiveTeams, ...) and included them in the PasskeyProvider.

For some of these, the fields/relations returned by UserRepository.findById wasn't enough. Unfortunately .findTeamsByUserId doesn't return enough info either

I didn't want to touch any of the existing queries, so I've added UserRepository.findByIdAndIncludeProfilesAndPassword

...which is the exact same as the email version of this function (findByEmailAndInclude...). It just looks the user up by their ID instead.

Checklist

  • I haven't checked if my PR needs changes to the documentation (unlikely though)
  • I haven't added tests that prove my fix is effective or that my feature works (this is possible with Playwright)

UI

Note about images

These are the same images from the old PR. There's one minor change since then: since icon components aren't supported for Button, EmptyPage, ... anymore, I used Lucide's key-round icon

This is what key-round looks like:

Versus the passkey icon:


Adds passkey button to login page:

CleanShot 2024-01-09 at 17 36 45@2x

Adds "Passkeys" settings section to sidebar:

CleanShot 2024-01-09 at 17 44 38@2x

Adds passkeys settings page

Empty:
CleanShot 2024-01-09 at 17 45 45@2x


Clicking on the "add" button and "sign in with a passkey" buttons opens a browser dialog. This looks different for every browser, phone, etc.

For example:
CleanShot 2024-01-09 at 17 47 48@2x

With passkeys added:
CleanShot 2024-01-09 at 17 49 38@2x

  • The name is set by the Hanko Passkeys API (our backend). We'll improve the name soon so it's not just a semi-random string and more user friendly
  • If the passkey was used, the description says e.g. "Created 3 days ago • Last used 5 minutes ago"

Dropdown stolen straight from API settings page:
CleanShot 2024-01-09 at 17 53 13@2x

Copy link

vercel bot commented Apr 25, 2024

@merlindru is attempting to deploy a commit to the cal Team on Vercel.

A member of the Team first needs to authorize it.

@github-actions github-actions bot added app-store area: app store, apps, calendar integrations, google calendar, outlook, lark, apple calendar app-store-template Created by Linear-GitHub Sync community Created by Linear-GitHub Sync foundation Low priority Created by Linear-GitHub Sync labels Apr 25, 2024
Copy link
Contributor

github-actions bot commented Apr 25, 2024

Thank you for following the naming conventions! 🙏 Feel free to join our discord and post your PR link.

@github-actions github-actions bot added the ❗️ .env changes contains changes to env variables label Apr 25, 2024
@PeerRich PeerRich changed the title Hanko passkeys support feat: Hanko passkeys support Apr 25, 2024
PeerRich
PeerRich previously approved these changes Apr 25, 2024
.env.example Outdated
@@ -116,15 +116,31 @@ NEXT_PUBLIC_FRESHCHAT_HOST=
# @see https://support.google.com/cloud/answer/6158849#public-and-internal&zippy=%2Cpublic-and-internal-applications
GOOGLE_LOGIN_ENABLED=false

# - GOOGLE CALENDAR/MEET/LOGIN
# Hanko Passkeys Config
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lets mention this lower in the file

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah was unsure about that. wanted to place it below google auth stuff since i did that everywhere else, but agreed, for the env file its a little too high up

@merlindru
Copy link
Author

We'd really like to use the passkey icon (not part of lucide, it's an SVG)

however the components that made use of it (Button, EmptyPage, ...) have all been changed to only accept a lucide icon name (string)

Is there any way we still could use a custom component as an icon for these?

@merlindru merlindru marked this pull request as ready for review April 25, 2024 08:06
@graphite-app graphite-app bot requested review from a team April 25, 2024 08:06
@dosubot dosubot bot added authentication area: authentication, auth, google sign in, password, SAML, password reset, can't log in ✨ feature New feature or request labels Apr 25, 2024
Copy link

graphite-app bot commented Apr 25, 2024

Graphite Automations

"Add foundation team as reviewer" took an action on this PR • (04/25/24)

1 reviewer was added to this PR based on Keith Williams's automation.

"Add consumer team as reviewer" took an action on this PR • (04/25/24)

1 reviewer was added to this PR based on Keith Williams's automation.

@merlindru
Copy link
Author

While PASSKEY_LOGIN_ENABLED hides all passkey related UI on the login page, the settings page as well as the API routes to register and remove passkeys stay enabled

These aren't strictly related to logging in with Passkeys; do you feel like the env var should disable everything related to passkeys or just the ability to login?

@@ -62,6 +63,7 @@
"@stripe/react-stripe-js": "^1.10.0",
"@stripe/stripe-js": "^1.35.0",
"@tanstack/react-query": "^5.17.15",
"@teamhanko/passkeys-next-auth-provider": "^0.2.7",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wish Node had a better way to make optional dependencies 🤷‍♂️

Copy link
Author

@merlindru merlindru Apr 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure since when npm has this, but there is optionalDependencies

https://docs.npmjs.com/cli/v10/configuring-npm/package-json#optionaldependencies

Was supported in yarn v1 so I assume v2+ has it too

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Opted not to do this for now because optionalDependencies isn't in use for any other packages atm. Also I'm unsure if a build without installing optional deps would be successful, especially because of import behavior, haven't tested it

Do you want me to test this? What other not-strictly-needed dependencies are there that could be moved to optionalDependencies (at least in theory)?


export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (!tenantId || !apiKey) {
return res.status(503).json({ message: "Passkey API not configured" });
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is 503 the best status code to use here?

Copy link
Author

@merlindru merlindru Apr 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other routes use 403: https://github.com/calcom/cal.com/blob/main/apps/web/pages/api/auth/signup.ts#L23

However, MDN says

[...] 503 Service Unavailable server error response code indicates that the server is not ready to handle the request.

Common causes are a server that is down for maintenance or that is overloaded. This response should be used for temporary conditions [...]

While in my mind 403 has always been more for insufficient permissions etc

What do you think? Maybe 403 for consistency's sake?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd prefer 403 Forbidden, 503 implies a server issue but most of the time this'll be a client issue (don't access the route)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't think a 403 is correct here though because that leads the client to believe they are lacking permissions when in reality the functionality isn't supported at all due to a lack of server configuration. Would consider 501 Not Implemented or 405 Method Not Allowed instead.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If everyone is fine with it, will go with 501 - seems like the most appropriate IMO

Copy link
Contributor

@emrysal emrysal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While PASSKEY_LOGIN_ENABLED hides all passkey related UI on the login page, the settings page as well as the API routes to register and remove passkeys stay enabled

These aren't strictly related to logging in with Passkeys; do you feel like the env var should disable everything related to passkeys or just the ability to login?

In line with current practises it's not needed to fully "unregister" routes

We'd really like to use the passkey icon (not part of lucide, it's an SVG)

Feel free to modify the button component to allow StartIcon's that aren't strings, ideally in a way it doesn't accept lucide icons (strings should be used instead).

Comment on lines +49 to +54
const IS_PASSKEY_LOGIN_ENABLED = !!(
process.env.PASSKEY_LOGIN_ENABLED === "true" &&
process.env.NEXT_PUBLIC_HANKO_PASSKEYS_TENANT_ID &&
process.env.HANKO_PASSKEYS_API_KEY
);

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we already have this in constants - lets put it from there

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do, but the GOOGLE variables are also duplicated in next-auth-options, so I did the same to stay consistent. Do you know if there's any reason for this?

Otherwise we could import both from constants.ts.
(I don't think the google constants differ from the ones in next-aut-options.ts in any way)

@keithwillcode keithwillcode added this to the v4.1 milestone May 8, 2024
PeerRich
PeerRich previously approved these changes May 16, 2024
Copy link
Member

@PeerRich PeerRich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

approved on behalf of @emrysal -- i just updated yarn.lock

@PeerRich PeerRich enabled auto-merge (squash) May 16, 2024 10:02
Copy link

socket-security bot commented May 16, 2024

🚨 Potential security issues detected. Learn more about Socket for GitHub ↗︎

To accept the risk, merge this PR and you will not be notified again.

Alert Package NoteSource
Install scripts npm/core-js@3.37.1
  • Install script: postinstall
  • Source: node -e "try{require('./postinstall')}catch(e){}"
  • orphan: npm/core-js@3.37.1

View full report↗︎

Next steps

What is an install script?

Install scripts are run when the package is installed. The majority of malware in npm is hidden in install scripts.

Packages should not be running non-essential scripts during install and there are often solutions to problems people solve with install scripts that can be run at publish time instead.

Take a deeper look at the dependency

Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support [AT] socket [DOT] dev.

Remove the package

If you happen to install a dependency that Socket reports as Known Malware you should immediately remove it and select a different dependency. For other alert types, you may may wish to investigate alternative packages or consider if there are other ways to mitigate the specific risk posed by the dependency.

Mark a package as acceptable risk

To ignore an alert, reply with a comment starting with @SocketSecurity ignore followed by a space separated list of ecosystem/package-name@version specifiers. e.g. @SocketSecurity ignore npm/foo@1.0.0 or ignore all packages with @SocketSecurity ignore-all

  • @SocketSecurity ignore npm/core-js@3.37.1

@merlindru
Copy link
Author

Thank you @PeerRich and reviewers! If this is it, then I'll make one commit to change the : any to void that Sean mentioned above. I don't think there's anything else to change.

auto-merge was automatically disabled May 20, 2024 11:52

Base branch was modified

@emrysal emrysal enabled auto-merge (squash) May 22, 2024 14:17
Passkeys requires "use client".
emrysal
emrysal previously approved these changes May 22, 2024
Copy link
Contributor

@emrysal emrysal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There was a missing "use client"; which I added, should be good to merge now 👏

Copy link
Contributor

📦 Next.js Bundle Analysis for @calcom/web

This analysis was generated by the Next.js Bundle Analysis action. 🤖

New Page Added

The following page was added to the bundle from the code in this PR:

Page Size (compressed) First Load % of Budget (350 KB)
/settings/security/passkeys 266.25 KB 494.82 KB 141.38%

One Page Changed Size

The following page changed size from the code in this PR compared to its base branch:

Page Size (compressed) First Load % of Budget (350 KB)
/auth/login 120.43 KB 349.01 KB 99.72% (🟡 +0.66%)
Details

Only the gzipped size is provided here based on an expert tip.

First Load is the size of the global bundle plus the bundle for the individual page. If a user were to show up to your website and land on a given page, the first load size represents the amount of javascript that user would need to download. If next/link is used, subsequent page loads would only need to download that page's bundle (the number in the "Size" column), since the global bundle has already been downloaded.

Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis

The "Budget %" column shows what percentage of your performance budget the First Load total takes up. For example, if your budget was 100kb, and a given page's first load size was 10kb, it would be 10% of your budget. You can also see how much this has increased or decreased compared to the base branch of your PR. If this percentage has increased by 20% or more, there will be a red status indicator applied, indicating that special attention should be given to this. If you see "+/- <0.01%" it means that there was a change in bundle size, but it is a trivial enough amount that it can be ignored.

@emrysal
Copy link
Contributor

emrysal commented May 22, 2024

@merlindru still has a consistently failing e2e test; could you have a looksy?

auto-merge was automatically disabled May 23, 2024 16:50

Merge queue setting changed

Copy link

socket-security bot commented Jun 1, 2024

New and removed dependencies detected. Learn more about Socket for GitHub ↗︎

Package New capabilities Transitives Size Publisher
npm/@types/node@16.9.1 None 0 1.63 MB types
npm/@types/react@18.0.26 None 0 178 kB types
npm/calcom-monorepo@0.0.0-use.local None 0 0 B
npm/rrule@2.8.1 None 0 687 kB davidgoli
npm/superjson@1.9.1 environment 0 212 kB skn0tt
npm/typescript@5.4.5 None 0 32.4 MB typescript-bot
npm/wipemycal@0.0.0-use.local None 0 0 B

🚮 Removed packages: npm/@0no-co/graphql.web@1.0.4, npm/@aashutoshrathi/word-wrap@1.2.6, npm/@ampproject/remapping@2.2.1, npm/@babel/compat-data@7.24.6, npm/@babel/helper-environment-visitor@7.24.6, npm/@babel/helper-plugin-utils@7.24.6, npm/@babel/helper-string-parser@7.24.6, npm/@babel/helper-validator-identifier@7.24.6, npm/@babel/helper-validator-option@7.24.6, npm/@babel/parser@7.24.6, npm/@babel/plugin-proposal-class-properties@7.18.6, npm/@babel/plugin-proposal-object-rest-spread@7.20.7, npm/@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2, npm/@babel/plugin-syntax-async-generators@7.8.4, npm/@babel/plugin-syntax-bigint@7.8.3, npm/@babel/plugin-syntax-class-properties@7.12.13, npm/@babel/plugin-syntax-class-static-block@7.14.5, npm/@babel/plugin-syntax-dynamic-import@7.8.3, npm/@babel/plugin-syntax-export-namespace-from@7.8.3, npm/@babel/plugin-syntax-import-meta@7.10.4, npm/@babel/plugin-syntax-json-strings@7.8.3, npm/@babel/plugin-syntax-jsx@7.24.6, npm/@babel/plugin-syntax-logical-assignment-operators@7.10.4, npm/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3, npm/@babel/plugin-syntax-numeric-separator@7.10.4, npm/@babel/plugin-syntax-object-rest-spread@7.8.3, npm/@babel/plugin-syntax-optional-catch-binding@7.8.3, npm/@babel/plugin-syntax-optional-chaining@7.8.3, npm/@babel/plugin-syntax-private-property-in-object@7.14.5, npm/@babel/plugin-syntax-top-level-await@7.14.5, npm/@babel/plugin-syntax-unicode-sets-regex@7.18.6, npm/@babel/plugin-transform-arrow-functions@7.24.6, npm/@babel/plugin-transform-block-scoped-functions@7.24.6, npm/@babel/plugin-transform-block-scoping@7.24.6, npm/@babel/plugin-transform-destructuring@7.24.6, npm/@babel/plugin-transform-for-of@7.24.6, npm/@babel/plugin-transform-literals@7.24.6, npm/@babel/plugin-transform-member-expression-literals@7.24.6, npm/@babel/plugin-transform-object-super@7.24.6, npm/@babel/plugin-transform-optional-chaining@7.24.6, npm/@babel/plugin-transform-parameters@7.24.6, npm/@babel/plugin-transform-property-literals@7.24.6, npm/@babel/plugin-transform-react-display-name@7.24.6, npm/@babel/plugin-transform-react-jsx-self@7.22.5, npm/@babel/plugin-transform-react-jsx-source@7.22.5, npm/@babel/plugin-transform-shorthand-properties@7.24.6, npm/@babel/plugin-transform-spread@7.24.6, npm/@babel/plugin-transform-template-literals@7.24.6, npm/@babel/preset-modules@0.1.6-no-external-plugins, npm/@babel/regjsgen@0.8.0, npm/@bcoe/v8-coverage@0.2.3, npm/@changesets/changelog-git@0.2.0, npm/@changesets/errors@0.2.0, npm/@changesets/get-version-range-type@0.4.0, npm/@changesets/git@3.0.0, npm/@changesets/logger@0.1.0, npm/@changesets/parse@0.4.0, npm/@changesets/pre@2.0.0, npm/@changesets/read@0.6.0, npm/@changesets/types@6.0.0, npm/@fastify/busboy@2.1.1, npm/@floating-ui/react-dom@1.3.0, npm/@gar/promisify@1.1.3, npm/@graphql-typed-document-node/core@3.2.0, npm/@hapi/hoek@9.3.0, npm/@hapi/topo@5.1.0, npm/@humanwhocodes/module-importer@1.0.1, npm/@isaacs/cliui@8.0.2, npm/@istanbuljs/load-nyc-config@1.1.0, npm/@istanbuljs/schema@0.1.3, npm/@jest/schemas@29.6.3, npm/@jridgewell/sourcemap-codec@1.4.15, npm/@manypkg/find-root@1.1.0, npm/@manypkg/get-packages@1.1.3, npm/@nodelib/fs.scandir@2.1.5, npm/@nodelib/fs.stat@2.0.5, npm/@nodelib/fs.walk@1.2.8, npm/@octokit/auth-token@4.0.0, npm/@octokit/core@5.1.0, npm/@octokit/plugin-paginate-rest@9.2.1, npm/@octokit/plugin-rest-endpoint-methods@10.4.1, npm/@pkgjs/parseargs@0.11.0, npm/@sinclair/typebox@0.27.8, npm/@sinonjs/fake-timers@10.3.0, npm/@tootallnate/once@2.0.0, npm/@types/minimist@1.2.5, npm/@types/node@12.20.55, npm/@types/normalize-package-data@2.4.4, npm/@types/tough-cookie@4.0.5, npm/@types/webidl-conversions@7.0.3, npm/@xmldom/xmldom@0.8.10, npm/abab@2.0.6, npm/abort-controller@3.0.0, npm/accepts@1.3.8, npm/acorn-jsx@5.3.2, npm/agent-base@6.0.2, npm/ansi-colors@4.1.3, npm/ansi-regex@6.0.1, npm/ansi-styles@4.3.0, npm/any-promise@1.3.0, npm/anymatch@3.1.3, npm/arg@5.0.2, npm/argparse@2.0.1, npm/array-union@2.1.0, npm/array.prototype.flat@1.3.2, npm/arrify@1.0.1, npm/asap@2.0.6, npm/asynckit@0.4.0, npm/at-least-node@1.0.0, npm/babel-plugin-istanbul@6.1.1, npm/babel-plugin-jest-hoist@29.6.3, npm/babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0, npm/babel-preset-current-node-syntax@1.0.1, npm/babel-preset-fbjs@3.4.0, npm/babel-preset-jest@29.6.3, npm/balanced-match@1.0.2, npm/base64-js@1.5.1, npm/before-after-hook@2.2.3, npm/better-path-resolve@1.0.0, npm/bl@4.1.0, npm/brace-expansion@2.0.1, npm/breakword@1.0.6, npm/bser@2.1.1, npm/bson@6.7.0, npm/buffer-from@1.1.2, npm/buffer@5.7.1, npm/bytes@3.1.2, npm/callsites@3.1.0, npm/camelcase-keys@6.2.2, npm/camelcase@5.3.1, npm/caniuse-lite@1.0.30001626, npm/chalk@2.4.2, npm/char-regex@1.0.2, npm/chardet@0.7.0, npm/charenc@0.0.2, npm/cli-cursor@3.1.0, npm/clone-deep@4.0.1, npm/clone@1.0.4, npm/co@4.6.0, npm/collect-v8-coverage@1.0.2, npm/color-convert@2.0.1, npm/color-name@1.1.3, npm/combined-stream@1.0.8, npm/commondir@1.0.1, npm/concat-map@0.0.1, npm/content-type@1.0.5, npm/convert-source-map@2.0.0, npm/cross-fetch@3.1.8, npm/cross-spawn@7.0.3, npm/crypt@0.0.2, npm/csv-generate@3.4.3, npm/csv-parse@4.16.3, npm/csv-stringify@5.6.5, npm/csv@5.5.3, npm/date-fns@2.30.0, npm/decamelize-keys@1.1.1, npm/decamelize@1.2.0, npm/decimal.js@10.4.3, npm/deep-is@0.1.4, npm/deepmerge@4.3.1, npm/defaults@1.0.4, npm/define-lazy-prop@2.0.0, npm/delayed-stream@1.0.0, npm/depd@2.0.0, npm/deprecation@2.3.1, npm/destroy@1.2.0, npm/detect-indent@6.1.0, npm/detect-newline@3.1.0, npm/diff-sequences@29.6.3, npm/dir-glob@3.0.1, npm/doctrine@3.0.0, npm/dot-case@3.0.4, npm/dotenv-expand@10.0.0, npm/dotenv@16.4.5, npm/eastasianwidth@0.2.0, npm/ee-first@1.1.1, npm/electron-to-chromium@1.4.788, npm/emittery@0.13.1, npm/emoji-regex@9.2.2, npm/encodeurl@1.0.2, npm/end-of-stream@1.4.4, npm/enquirer@2.4.1, npm/entities@4.5.0, npm/error-ex@1.3.2, npm/error-stack-parser@2.1.4, npm/es-to-primitive@1.2.1, npm/escalade@3.1.2, npm/escape-html@1.0.3, npm/escape-string-regexp@1.0.5, npm/eslint-scope@7.2.2, npm/eslint-visitor-keys@3.4.3, npm/esprima@4.0.1, npm/esquery@1.5.0, npm/esrecurse@4.3.0, npm/estraverse@5.3.0, npm/esutils@2.0.3, npm/etag@1.8.1, npm/event-target-shim@5.0.1, npm/events@3.3.0, npm/exit@0.1.2, npm/extendable-error@0.1.7, npm/external-editor@3.1.0, npm/fast-deep-equal@3.1.3, npm/fast-json-stable-stringify@2.1.0, npm/fb-watchman@2.0.2, npm/fbjs-css-vars@1.0.2, npm/file-entry-cache@6.0.1, npm/find-up@4.1.0, npm/find-yarn-workspace-root2@1.2.16, npm/follow-redirects@1.15.6, npm/for-each@0.3.3, npm/form-data@4.0.0, npm/fresh@0.5.2, npm/fs-extra@7.0.1, npm/fs.realpath@1.0.0, npm/fsevents@2.3.3, npm/function.prototype.name@1.1.6, npm/functions-have-names@1.2.3, npm/gensync@1.0.0-beta.2, npm/get-caller-file@2.0.5, npm/get-package-type@0.1.0, npm/get-stream@4.1.0, npm/glob-parent@6.0.2, npm/globby@11.1.0, npm/gopd@1.0.1, npm/graceful-fs@4.2.11, npm/grapheme-splitter@1.0.4, npm/graphemer@1.4.0, npm/graphql-tag@2.12.6, npm/hard-rejection@2.1.0, npm/has-bigints@1.0.2, npm/has-flag@3.0.0, npm/has-symbols@1.0.3, npm/hosted-git-info@2.8.9, npm/html-escaper@2.0.2, npm/https-proxy-agent@5.0.1, npm/human-id@1.0.2, npm/human-signals@2.1.0, npm/iconv-lite@0.4.24, npm/ieee754@1.2.1, npm/import-fresh@3.3.0, npm/imurmurhash@0.1.4, npm/indent-string@4.0.0, npm/inflight@1.0.6, npm/inherits@2.0.4, npm/invariant@2.2.4, npm/ipaddr.js@1.9.1, npm/is-arrayish@0.2.1, npm/is-bigint@1.0.4, npm/is-boolean-object@1.1.2, npm/is-buffer@1.1.6, npm/is-callable@1.2.7, npm/is-date-object@1.0.5, npm/is-docker@2.2.1, npm/is-extglob@2.1.1, npm/is-generator-fn@2.1.0, npm/is-generator-function@1.0.10, npm/is-glob@4.0.3, npm/is-interactive@1.0.0, npm/is-number-object@1.0.7, npm/is-number@7.0.0, npm/is-path-inside@3.0.3, npm/is-plain-obj@1.1.0, npm/is-plain-object@2.0.4, npm/is-potential-custom-element-name@1.0.1, npm/is-regex@1.1.4, npm/is-stream@1.1.0, npm/is-string@1.0.7, npm/is-subdir@1.2.0, npm/is-symbol@1.0.4, npm/is-unicode-supported@0.1.0, npm/is-weakref@1.0.2, npm/is-windows@1.0.2, npm/is-wsl@2.2.0, npm/isarray@2.0.5, npm/isexe@2.0.0, npm/isobject@3.0.1, npm/jest-diff@29.7.0, npm/jest-get-type@29.6.3, npm/jest-matcher-utils@29.7.0, npm/jest-pnp-resolver@1.2.3, npm/jest-regex-util@29.6.3, npm/js-tokens@4.0.0, npm/js-yaml@3.14.1, npm/jsesc@2.5.2, npm/json-buffer@3.0.1, npm/json-parse-better-errors@1.0.2, npm/json-parse-even-better-errors@2.3.1, npm/json-schema-traverse@1.0.0, npm/json-stable-stringify-without-jsonify@1.0.1, npm/json5@2.2.3, npm/kind-of@6.0.3, npm/kleur@3.0.3, npm/levn@0.4.1, npm/lines-and-columns@1.2.4, npm/load-yaml-file@0.2.0, npm/locate-path@6.0.0, npm/lodash.debounce@4.0.8, npm/lodash.isequal@4.5.0, npm/lodash.merge@4.6.2, npm/lodash.startcase@4.4.0, npm/lodash.throttle@4.1.1, npm/lodash@4.17.21, npm/log-symbols@4.1.0, npm/loose-envify@1.4.0, npm/lower-case@2.0.2, npm/make-dir@4.0.0, npm/makeerror@1.0.12, npm/map-obj@4.3.0, npm/md5@2.3.0, npm/media-typer@0.3.0, npm/memory-pager@1.5.0, npm/merge-stream@2.0.0, npm/merge2@1.4.1, npm/mime-db@1.52.0, npm/mime-types@2.1.35, npm/mime@1.6.0, npm/min-indent@1.0.1, npm/minimist-options@4.1.0, npm/minimist@1.2.8, npm/mixme@0.5.10, npm/moment@2.30.1, npm/ms@2.1.2, npm/mz@2.7.0, npm/nanoid@3.3.7, npm/natural-compare@1.4.0, npm/negotiator@0.6.3, npm/neo-async@2.6.2, npm/nice-try@1.0.5, npm/no-case@3.0.4, npm/node-abort-controller@3.1.1, npm/node-forge@1.3.1, npm/node-int64@0.4.0, npm/node-releases@2.0.14, npm/normalize-package-data@2.5.0, npm/normalize-path@3.0.0, npm/npm-run-path@4.0.1, npm/nullthrows@1.1.1, npm/nwsapi@2.2.10, npm/object-assign@4.1.1, npm/object-keys@1.1.1, npm/on-finished@2.4.1, npm/once@1.4.0, npm/ora@5.4.1, npm/os-tmpdir@1.0.2, npm/outdent@0.5.0, npm/p-finally@1.0.0, npm/p-limit@2.3.0, npm/p-locate@4.1.0, npm/p-map@4.0.0, npm/p-try@2.2.0, npm/parent-module@1.0.1, npm/parse-json@4.0.0, npm/parse5@7.1.2, npm/parseurl@1.3.3, npm/password-prompt@1.1.3, npm/path-exists@4.0.0, npm/path-is-absolute@1.0.1, npm/path-key@3.1.1, npm/path-parse@1.0.7, npm/path-type@4.0.0, npm/picocolors@1.0.1, npm/picomatch@2.3.1, npm/pify@4.0.1, npm/pirates@4.0.6, npm/pkg-dir@4.2.0, npm/pkg-up@3.1.0, npm/pngjs@3.4.0, npm/prelude-ls@1.2.1, npm/prettier@2.8.8, npm/pretty-format@29.7.0, npm/process-nextick-args@2.0.1, npm/promise@7.3.1, npm/prompts@2.4.2, npm/prop-types@15.8.1, npm/proxy-from-env@1.1.0, npm/pseudomap@1.0.2, npm/psl@1.9.0, npm/pump@3.0.0, npm/punycode@2.3.1, npm/querystringify@2.2.0, npm/queue-microtask@1.2.3, npm/quick-lru@4.0.1, npm/range-parser@1.2.1, npm/react-error-boundary@3.1.4, npm/react-is@18.3.1, npm/react-refresh@0.14.2, npm/react@18.3.1, npm/read-pkg-up@7.0.1, npm/read-pkg@5.2.0, npm/read-yaml-file@1.1.0, npm/readable-stream@3.6.2, npm/redent@3.0.0, npm/regenerate@1.4.2, npm/regenerator-transform@0.15.2, npm/regexpu-core@5.3.2, npm/regjsparser@0.9.1, npm/require-directory@2.1.1, npm/require-from-string@2.0.2, npm/require-main-filename@2.0.0, npm/requires-port@1.0.0, npm/resolve-from@5.0.0, npm/resolve.exports@2.0.2, npm/restore-cursor@3.1.0, npm/reusify@1.0.4, npm/run-parallel@1.2.0, npm/safe-buffer@5.2.1, npm/safer-buffer@2.1.2, npm/scheduler@0.23.2, npm/semver@7.6.2, npm/serve-static@1.15.0, npm/set-blocking@2.0.0, npm/setimmediate@1.0.5, npm/setprototypeof@1.2.0, npm/shallow-clone@3.0.1, npm/shebang-regex@1.0.0, npm/shell-quote@1.8.1, npm/sisteransi@1.0.5, npm/slash@3.0.0, npm/smartwrap@2.0.2, npm/snake-case@3.0.4, npm/source-map-js@1.2.0, npm/source-map@0.6.1, npm/spawndamnit@2.0.0, npm/spdx-correct@3.2.0, npm/spdx-exceptions@2.5.0, npm/spdx-expression-parse@3.0.1, npm/sprintf-js@1.0.3, npm/stack-utils@2.0.6, npm/statuses@2.0.1, npm/stream-transform@2.1.3, npm/string-length@4.0.2, npm/strip-bom@3.0.0, npm/strip-eof@1.0.0, npm/strip-final-newline@2.0.0, npm/strip-indent@3.0.0, npm/strip-json-comments@3.1.1, npm/strnum@1.0.5, npm/supports-color@7.2.0, npm/supports-hyperlinks@2.3.0, npm/supports-preserve-symlinks-flag@1.0.0, npm/symbol-tree@3.2.4, npm/term-size@2.2.1, npm/text-table@0.2.0, npm/thenify-all@1.6.0, npm/thenify@3.3.1, npm/through2@2.0.5, npm/through@2.3.8, npm/tmp@0.0.33, npm/tmpl@1.0.5, npm/to-fast-properties@2.0.0, npm/to-regex-range@5.0.1, npm/toidentifier@1.0.1, npm/tr46@0.0.3, npm/trim-newlines@3.0.1, npm/tslib@2.6.2, npm/tunnel@0.0.6, npm/type-check@0.4.0, npm/type-detect@4.0.8, npm/type-fest@0.21.3, npm/type-is@1.6.18, npm/unbox-primitive@1.0.2, npm/unicode-canonical-property-names-ecmascript@2.0.0, npm/unicode-match-property-ecmascript@2.0.0, npm/unicode-match-property-value-ecmascript@2.1.0, npm/unicode-property-aliases-ecmascript@2.1.0, npm/universal-user-agent@6.0.1, npm/universalify@0.1.2, npm/unpipe@1.0.0, npm/uri-js@4.4.1, npm/url-parse@1.5.10, npm/util-deprecate@1.0.2, npm/utils-merge@1.0.1, npm/uuid@8.3.2, npm/validate-npm-package-license@3.0.4, npm/vary@1.1.2, npm/walker@1.0.8, npm/wcwidth@1.0.1, npm/webidl-conversions@7.0.0, npm/whatwg-mimetype@3.0.0, npm/which-boxed-primitive@1.0.2, npm/which-module@2.0.1, npm/which-pm@2.0.0, npm/which@2.0.2, npm/wrap-ansi@7.0.0, npm/wrappy@1.0.2, npm/write-file-atomic@4.0.2, npm/ws@8.17.0, npm/xml-name-validator@4.0.0, npm/xmlbuilder@15.1.1, npm/xmlchars@2.2.0, npm/xtend@4.0.2, npm/y18n@5.0.8, npm/yallist@4.0.0, npm/yocto-queue@0.1.0

View full report↗︎

@PeerRich PeerRich modified the milestones: v4.2, v4.3 Jun 3, 2024
@merlindru
Copy link
Author

@emrysal Sorry, maybe I'm being dumb, but which e2e test is failing/how can I run it?

With yarn e2e, I don't see anything passkeys related on my end, but there are hundreds of failing tests there, so maybe my setup is borked

Also thanks for staying on top of this :) Much appreciated!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
app-store area: app store, apps, calendar integrations, google calendar, outlook, lark, apple calendar app-store-template Created by Linear-GitHub Sync authentication area: authentication, auth, google sign in, password, SAML, password reset, can't log in community Created by Linear-GitHub Sync ❗️ .env changes contains changes to env variables ✨ feature New feature or request foundation Low priority Created by Linear-GitHub Sync
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[CAL-2984] Add Passkey support
6 participants